/**
 * @file ImageStream.hpp
 * @brief Client的ShareMem接收端
 */

#ifndef IMAGE_STREAM_H
#define IMAGE_STREAM_H

#include <string>
#include <semaphore.h>

/**
 * @class ImageStream
 * @brief 从共享内存中获取client提供的图像数据流
 * @note
 * 共享内存规则：/SUPERMATRIX_REALTIME_IMAGE_MEM_{设备ID}
 * 信号量规则：/SUPERMATRIX_REALTIME_IMAGE_SEM_{设备ID}
 */
class ImageStream
{
  private:
    /**
     * @brief 延时频率
     */
    long clockdelay;

    /**
     * @brief 共享内存指针
     */
    unsigned char* sharemem;
    /**
     * @brief 共享内存文件描述符
     */
    int sharefd;
    /**
     * @brief 共享内存的图片部分大小（指最大图片大小）
     */
    size_t imagesize;
    /**
     * @brief 信号量
     */
    sem_t* sem;

  public:
    /**
     * @brief 构造函数
     * @exception std::runtime_error 当打开共享内存或者信号量失败时抛出
     *
     * @param uuid 设备UUID
     */
    ImageStream(const std::string& uuid);
    /**
     * @brief 析构函数
     */
    virtual ~ImageStream();
    /**
     * @brief 调用该接口获取实时图像
     *
     * @param image 由外部提供的内存指针,大小至少满足GetSize()
     *
     * @result 帧号
     */
    long/*frameID*/ GetRealtimeImg(unsigned char* image);
    /**
     * @brief 获取共享内存大小
     * @result 共享内存大小（字节）
     */
    [[nodiscard]]
    long GetSize();
};

#endif
